package com.tecode.myBooks.product.servlet;

import com.tecode.myBooks.bean.Page;
import com.tecode.myBooks.product.bean.Product;
import com.tecode.myBooks.product.service.ProductService;
import net.sf.json.JSONObject;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

/**
 * Created by Administrator on 2018/11/28.
 *
 * 处理所有和商品请求相关的的Servlet
 */
@WebServlet("/bookServlet")
public class ProductServlet extends HttpServlet{

private ProductService productService = new ProductService();

	protected void adminBookInfo(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String productId = req.getParameter("id");

		//1.把传入的书籍的编号，传入给获得书籍详情的业务处理方法。
		req.setAttribute("bookInfo",productService.getProductById(productId,null));

		//获得商品的所有状态列表
		req.setAttribute("codeState",productService.getCodeStateList(1));
		req.getRequestDispatcher("/admin/bookInfo.jsp").forward(req,resp);

	}
/**
 * @Author Gabriel
 * @Description //TODO 查询所有的书籍   包含所有状态。
 * @Date 2018/12/14
 * @Param [req, resp]
 * @Return void
 */
    protected void adminBookList(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            long pageNo = 1;
            try{
                pageNo = Long.parseLong(req.getParameter("pageNo"));
            }catch (Exception e){}

			Page<Product> page = productService.getProductPage(pageNo,null);

			//把查询到的对象已json的数据返回给前台。

		JSONObject jsonObject = JSONObject.fromObject(page);
		//响应json数据给前台。
		resp.getWriter().print(jsonObject);
	}

/**查询具体一本书的详情方法
 * @Author Gabriel
 * @Description //TODO
 * @Date 2018/12/10
 * @Param [req, resp]
 * @Return void
 * */
    protected void bookInfo(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String productId = req.getParameter("id");

            //1.把传入的书籍的编号，传入给获得书籍详情的业务处理方法。
        req.setAttribute("bookInfo",productService.getProductById(productId,2));

        req.getRequestDispatcher("/jsp/bookInfo.jsp").forward(req,resp);

    }
        /**
		 * 获得首页展示的商品的请求处理方法
		 * @param req
		 * @param resp
		 * @throws ServletException
		 * @throws IOException
		 */
    protected void getBookList(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //存放 请求的页面数。  默认为第一页
        long pageNo =1;
        try {
            pageNo = Long.parseLong(req.getParameter("pageNo"));
        }catch (Exception e){}
        //调用业务方法，获得首页展示的商品信息
        // List<Product> bookList = productService.getBookList();
        Page<Product> page = productService.getProductPage(pageNo,2);

        //如果一个数据需要在嵌套的页面上进行展示，则需要把数据加入到域对象中。
        //request 域：  作用范围在同一次请求中。
        /**
         * page：作用在jsp的当前页面的范围
         * request：作用在一起请求。
         * session：作用在一次回话
         * application：作用在整个工程下。
         */
        req.setAttribute("page",page);

        /**
         *
         * 在转发请求中最前面的 / 表示，当前工程的根目录
         *      http://localhost/MyBooks
         *
         */
        RequestDispatcher dispatcher = req.getRequestDispatcher("/jsp/bookList.jsp");

        //进行转发
        dispatcher.forward(req,resp);

    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

            //1.修改请求的字符集编码
             req.setCharacterEncoding("UTF-8");
             //2.修改响应的字符集编码和类型
            resp.setCharacterEncoding("UTF-8");
            resp.setContentType("text/html");

            //3.获得处理当前请求的方法的名称   methodName    getBookList
            String methodName = req.getParameter("methodName");
        try {
            //通过运行时类 来获得运行时类中的方法。
            Method method = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            //设置运行访问到非public 的方法
            method.setAccessible(true);
            //执行方法
            method.invoke(this,req,resp);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}
